package biz.gieraltowski.lukships;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class LukShips extends Canvas implements Stage {

	public long usedTime;

	public BufferStrategy strategy;
	private SpriteCache spritecache;
	private boolean drawFps = true;
	private ArrayList<Actor> actors;

	public LukShips() {
		JFrame frame = new JFrame("LukShips");
		JPanel panel = (JPanel) frame.getContentPane();
		setBounds(0, 0, Stage.WIDTH, Stage.HEIGHT);

		frame.setBounds(0, 0, Stage.WIDTH, Stage.HEIGHT);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(false);

		panel.setPreferredSize(new Dimension(Stage.WIDTH, Stage.HEIGHT));
		panel.setLayout(null);
		panel.add(this);

		createBufferStrategy(2);
		strategy = getBufferStrategy();
		requestFocus();

		spritecache = new SpriteCache();
		initWorld();
	}

	/**
	 * Tworzenie świata
	 */
	public void initWorld() {
		/** tworzenie Marceli */
		actors = new ArrayList<Actor>();
		Random rand = new Random();
		Marcel m;

		for (int i = 0; i < 20; i++) {
			m = new Marcel(this);
			int a = rand.nextInt(Stage.WIDTH - m.width);
			int b = rand.nextInt(Stage.HEIGHT - m.height);

			m.setX(a);
			m.setY(b);
			m.setVx(rand.nextInt(10) + 1);
			m.setVy(rand.nextInt(10) + 1);

			actors.add(m);
		}

	}

	/**
	 * Przerysowanie elementów świata
	 */
	public void paintWorld() {
		Graphics2D g = (Graphics2D) strategy.getDrawGraphics();

		/** czyszczenie świata */
		g.setColor(Color.black);
		g.fillRect(0, 0, getWidth(), getHeight());

		/** rysowanie aktorów */
		for (Actor a : actors) {
			a.paint(g);
		}

		/** rysowanie licznika fps */
		if (drawFps) {
			g.setColor(Color.white);
			if (usedTime == 0) // zabezpieczenie przed dzieleniem przez zero
				usedTime = 1;
			g.drawString(String.valueOf(999 / usedTime) + " fps", Stage.WIDTH - 50, 20);
		}

		strategy.show();
	}

	/**
	 * Zmiana wartości obiektów po odświerzeniu ekranu
	 */
	public void updateWorld() {
		for (Actor a : actors) {
			a.act();
		}
	}

	/**
	 * Wykonuje pętlę:
	 * - policzenie na nowo wartości obiektów
	 * - przerysowanie świata
	 * Oraz liczy czas wykonania pętli (fps)
	 */
	public void game() {
		usedTime = 999; // czas wykonania pętli
		while (isVisible()) {
			long startTime = System.currentTimeMillis();
			updateWorld();
			paintWorld();
			usedTime = System.currentTimeMillis() - startTime;
			try {
				Thread.sleep(SPEED);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	public SpriteCache getSpriteCache() {
		return spritecache;
	}

	public static void main(String[] args) {
		LukShips ls = new LukShips();
		ls.game();
	}

}
